package com.tabnet.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.tabnet.beans.personnes.Adresse;
import com.tabnet.dao.DAOAdresse;
import com.tabnet.dao.DAOException;
import com.tabnet.dao.DAOFactory;
import com.tabnet.dao.DAOUtilitaire;

public class AdresseDAOImpl implements DAOAdresse {

	private static final String SQL_SELECT_BY_ID  		= "SELECT IDAdresse, Rue, CodePostal, Ville, Pays FROM Adresse a WHERE IDAdresse = ?";
	private static final String SQL_INSERT_ADRESSE 		= "INSERT INTO Adresse (Rue, CodePostal, Ville, Pays) VALUES ( ?, ?, ?, ?);";
	private static final String SQL_UPDATE_ADRESSE 		= "UPDATE Adresse SET Rue = ?, CodePostal = ?, Ville = ?, Pays = ? WHERE IDAdresse = ?;";

    private DAOFactory daoFactory;
	
    public AdresseDAOImpl( DAOFactory daoFactory ) {
        this.daoFactory = daoFactory;
    }
    
	@Override
	public Adresse trouverAdr(int id) throws DAOException {
		Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Adresse adr = new Adresse();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            /*
             * Préparation de la requête avec les objets passés en arguments
             * (ici, uniquement un id) et exécution.
             */
            preparedStatement =  DAOUtilitaire.initialisationRequetePreparee( connexion, SQL_SELECT_BY_ID, false, id );
            resultSet = preparedStatement.executeQuery();
            /* Parcours de la ligne de données retournée dans le ResultSet */
            if ( resultSet.next() ) {
            	adr.setId( resultSet.getInt("IDAdresse") );
            	adr.setRue(resultSet.getString( "Rue" ));
            	adr.setCodePostal(resultSet.getString( "CodePostal" ));
            	adr.setVille(resultSet.getString( "Ville" ));
            	adr.setPays(resultSet.getString( "Pays" ));
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            DAOUtilitaire.fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }

        return adr;
	}

	@Override
	public void addAdresse(Adresse adr) throws DAOException {
        //insertion adresse
		Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;

        try {
            connexion = daoFactory.getConnection();
            
            // insertion de l'adresse
            preparedStatement = DAOUtilitaire.initialisationRequetePreparee( connexion, SQL_INSERT_ADRESSE, true,
        		    			adr.getRue(), adr.getCodePostal(), adr.getVille(), adr.getPays() );

            int statut = preparedStatement.executeUpdate();
            
            // on récupère l'id généré
            ResultSet rs = preparedStatement.getGeneratedKeys();
            rs.first();
            adr.setId(rs.getInt(1));

            if ( statut == 0 ) {
                throw new DAOException( "Échec de la création de l'adresse, aucune ligne ajoutée dans la table." );
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
        	 DAOUtilitaire.fermeturesSilencieuses( valeursAutoGenerees, preparedStatement, connexion );
        }
	}

	@Override
	public void updAdresse(Adresse adr) throws DAOException {
		//modification de l'adresse
		Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;

        try {
            connexion = daoFactory.getConnection();
            
            // mise à jour de l'adresse
            preparedStatement = DAOUtilitaire.initialisationRequetePreparee( connexion, SQL_UPDATE_ADRESSE, true,
        		    	adr.getRue(), adr.getCodePostal(), adr.getVille(), adr.getPays(), adr.getId() );
                            

            int statut = preparedStatement.executeUpdate();
            if ( statut == 0 ) {
                throw new DAOException( "Échec de la mise à jour de l'adresse, aucune ligne ajoutée dans la table." );
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
        	 DAOUtilitaire.fermeturesSilencieuses( valeursAutoGenerees, preparedStatement, connexion );
        }
	}

}
